﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms;
using System.Collections.ObjectModel;
using Entidades.Seguridad;
using Microsoft.SqlServer.Dts.Runtime;
using Vista.Sistema;
using Microsoft.SqlServer.Dts;
using Application = System.Windows.Forms.Application;


namespace Vista
{
    public partial class FormUnipan : Form
    {
        private Entidades.Seguridad.Usuario _Usuario;
        private Form _Form;

        private ReadOnlyCollection<Entidades.Seguridad.Perfil> _Perfiles;
        private ReadOnlyCollection<Entidades.Seguridad.Modulo> _Modulos;

        public FormUnipan(Entidades.Seguridad.Usuario usuario)
        {
            InitializeComponent();
            _Usuario = usuario;
            _Perfiles = Controladora.Seguridad.CUIniciarSesion.ObtenerInstancia().RecuperarPerfilesGrupos(_Usuario);
            this.CenterToScreen();
            this.Text = "Panificadora UNIPAN";
        }

        private void FormPrincipalDinamico_Load(object sender, EventArgs e)
        {
            ToolStripDropDownButton MENU_MODULO;
            _Modulos = Controladora.Seguridad.CUIniciarSesion.ObtenerInstancia().ConsultarModulos();

            foreach (Entidades.Seguridad.Modulo oMODULO in _Modulos)
            {
                // por cáda módulo creo un objeto ToolStripDropDownButton
                MENU_MODULO = new ToolStripDropDownButton();
                // le asigno los parámetros name y text al objeto
                MENU_MODULO.Name = oMODULO.IdModulo;
                MENU_MODULO.Text = oMODULO.Descripcion;

                //inserto el objeto creado a la barra de menúes del formulario
                msMENU.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { MENU_MODULO });

                //busco las funciones asociadas al formulario
                ARMA_FUNCIONES(oMODULO, MENU_MODULO);
            }
        }

        private void ARMA_FUNCIONES(Entidades.Seguridad.Modulo MODULO, ToolStripDropDownButton MEN_FUNCION)
        {
            //le solicito a la controladora la lista de funciones de
            //un módulo determinado
            // defino un objeto ToolStripMenuItem para asignar las funciones recuperadas
            ToolStripMenuItem MENU_FUNCIONES;

            //recorro el listado de funciones
            //foreach (Entidades.Seguridad.Formulario oFORM in  cPERFIL.obtenerFormularios(oUSUARIO.usu_codigo, MODULO.mod_codigo))


            //Agrupo el perfil por formulario y lo filtro según el modulo

            var query =
                from _pergroup in _Perfiles
                where _pergroup.Formulario.Modulo.IdModulo == MODULO.IdModulo
                group _pergroup by new
                                       {
                                           ID = _pergroup.Formulario.IdFormulario,
                                           Nombre = _pergroup.Formulario.Nombre,
                                           Desc = _pergroup.Formulario.Descripcion
                                       }
                into grop
                select new
                           {
                               ID = grop.Key.ID,
                               Nombre = grop.Key.Nombre,
                               Desc = grop.Key.Desc
                           };

            foreach (var oFuncion in query)
            {
                // creo el objeto ToolStripMenuItem para cargar la funcion recibida
                
                MENU_FUNCIONES = new ToolStripMenuItem();
                MENU_FUNCIONES.Name = oFuncion.Nombre;
                MENU_FUNCIONES.Text = oFuncion.Desc;
                MENU_FUNCIONES.Tag = oFuncion.Nombre;

                //agrego la función al módulo asociado
                MEN_FUNCION.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { MENU_FUNCIONES });

                //le asigno el método que tiene que ejecutar cuando se 
                //dispare el evento click de la función
                MENU_FUNCIONES.Click += new EventHandler(this.ITEM_CLICK);
            }
        }

        private void ITEM_CLICK(object sender, EventArgs e)
        {
            // al hacer click en algún objeto ToolStripMenuItem
            // se dispara este evento
            // el atributo sender me permite identificar que opción
            // del menú generó el evento
            ToolStripMenuItem seleccion = (ToolStripMenuItem)sender;
            // si el atributo tag es distinto de 0 es porque tiene definido 
            // el nombre dle formulario
            if ((string)seleccion.Tag != "0")
            {
                // le pido al compilador que me recupere todos los elementos del
                // asembly (proyecto VISTA)
                // comienzo a recorrer cada elemento devuelto
                foreach (System.Type type in Assembly.GetExecutingAssembly().GetTypes())
                {
                    //pregunto si es de tipo Formulario
                    if (type.IsSubclassOf(typeof(Form)))
                    {
                        // verifico si el nombre del formulario es igual al
                        // atributo tag que tiene el nombre del formulario
                        // a abrir
                        if (type.Name.ToString() == (string)seleccion.Tag)
                        {
                            try
                            {
                                //si corresponde creo una instancia de ese objeto
                                Type t = type as Type;
                                // aplicando reflection invoco el metodo getINSTANCIA del formulario
                                _Form = (Form)t.InvokeMember("obtener_instancia", BindingFlags.Default | BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.InvokeMethod, null, null, new object[] { this._Usuario }) as System.Windows.Forms.Form;
                                //ejecuto el método show del formulario para que lo muestre
                                _Form.Show();
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.Message);
                            }
                        }
                    }
                }
            }
        }
    }
}
